package librairies.liste.interfaces;

import librairies.exception.HorsBornes;

/**
 * Definition d'une liste.
 * 
 * @author mlozach
 * @param <E> type de l'element se trouvant dans la liste.
 */
public interface IListe<E> 
{
	/**
	 * permet de savoir si il y a au moins un element.
	 * @return vrai si y a un element minimum.
	 */
	boolean	isEmpty();
	
	/**
	 * permet de connaitre la taille de la liste.
	 * @return la taille de la liste.
	 */
	int	size();
	
	/**
	 * permet de supprimer tous les liens des chainons.
	 * @return la nouvelle liste.
	 */
	IListe<E> clear();
	
	/**
	 * permet de recuperer l'element a l'indice donnee.
	 * @param i indice dans la liste.
	 * @return l'element demander.
	 * @throws HorsBornes.
	 */
	E get(int i) throws HorsBornes;
	
	/**
	 * permet de modifier l'objet a la position demandee.
	 * @param i l'indice dans la liste.
	 * @param e le nouvelle element.
	 * @return l ancienne valeur.
	 * @throws HorsBornes
	 */
	E set(int i, E e) throws HorsBornes; 
	
	/**
	 * permet de dire si un element existe.
	 * @param o l'objet a chercher.
	 * @return l'indice du premier objet.
	 */
	int	contains(Object o);
	
	/**
	 * permet de dire si un element existe.
	 * @param o l'objet a chercher.
	 * @param equals <true> equals, <false> contains
	 * @return l'indice du premier objet.
	 */
	int	containsEquals(Object o, boolean equals);
	
	/**
	 * permet de dire si tous les objets existent dans la liste.
	 * @param l la liste a trouver.
	 * @return faux si un element n'existe pas.
	 */
	boolean containsAll(IListe<?> l);
	
	/**
	 * permet de tester si deux listes sont egaux.
	 * @param o la liste a comparer.
	 * @return vrai si les deux listes sont egaux.
	 */
	boolean	equals(Object o);
	
	/**
	 * permet d'ajouter un element a la fin de la liste.
	 * @param e le nouvelle element.
	 * @return la nouvelle liste.
	 */
	IListe<E> add(E e); 
	
	/**
	 * permet d'ajouter un element a une position demandee.
	 * @param i la position demander.
	 * @param e le nouvelle element.
	 * @return la nouvelle liste.
	 * @throws HorsBornes
	 */
	IListe<E> add(int i, E e) throws HorsBornes; 
	
	/**
	 * permet d'ajouter une liste d'element a la fin de la liste
	 * @param l la liste d element a ajouter
	 * @return la nouvelle liste
	 */
	IListe<E> addAll(IListe<? extends E> l);
	
	/**
	 * permet de rajouter une sous liste dans la liste a partir d'une position donner.
	 * @param i la position donner.
	 * @param l la sous liste.
	 * @return la nouvelle liste.
	 * @throws HorsBornes
	 */
	IListe<E> addAll(int i, IListe<? extends E> l) throws HorsBornes; 
	
	/**
	 * permet de supprimer un element a une position donner.
	 * @param i la position donner.
	 * @return l'element supprimer.
	 * @throws HorsBornes
	 */
	E remove(int i) throws HorsBornes;
	
	/**
	 * permet de recuperer une sous liste.
	 * @param deb la position de debut de la sous-liste.
	 * @param fin la position de fin de la sous-liste.
	 * @return la sous liste.
	 * @throws HorsBornes
	 */
	IListe<E> subList(int deb, int fin) throws HorsBornes;
}
